#include "main.h"

/*********************
 * 项目介绍:学生管理系统
 * 作者:hx
 * 要求:增删改查 保存 链表
 * 进度:完成
 ********************/
/*定义学生个数*/
uint16_t student_num = 0;
/*定义链表头节点*/
_my_type *p_head = NULL;
/*节点初始化*/
void note_init(_my_type * mydata)
{
    /*清空数据域*/
    memset(&(mydata->data),0,sizeof(mydata->data));
    /*清空指针域*/
    mydata->p_next = NULL;
}
/*申请链表头*/
void create_head(void)
{
    /*申请空间*/
    p_head = (_my_type*)malloc(sizeof(_my_type));
    /*节点初始化*/
    note_init(p_head);
}
/********************
 * 函数名:add_student
 * 作用：增加学生信息
 * 参数：无
 * 返回值：无
 * 作者：hx
 *******************/
void add_student(void)
{
    /*保存头节点信息*/
    _my_type * p_tmp = p_head;
    /*申请节点*/
    _my_type *p_new = (_my_type*)malloc(sizeof(_my_type));
    /*初始化节点*/
    note_init(p_new);
    /*填充节点*/
    getchar();
    printf("请输入学生姓名\n");
    scanf("%s",p_new->data.name);
    printf("请输入学生学号\n");
    scanf("%d",&p_new->data.ID);
    printf("请输入学生性别\n");
    scanf("%s",p_new->data.sex);
    printf("请输入学生年龄\n");
    scanf("%d",&p_new->data.age);
    /*找到链表尾*/
    while(p_tmp->p_next != NULL)
    {
        p_tmp = p_tmp->p_next;
    }
    /*链接节点*/
    p_tmp->p_next = p_new;
    /*学生数量加1,且提示*/
    student_num++;
    printf("添加成功\n");
}
/********************
 * 函数名:ui_show
 * 作用：界面菜单
 * 参数：无
 * 返回值：无
 * 作者：hx
 *******************/
void ui_show(void)
{
    printf("************************************\n");
    printf("**********学生信息管理系统**********\n");
    printf("**********<1>添加学生信息***********\n");
    printf("**********<2>删除学生信息***********\n");
    printf("**********<3>修改学生信息***********\n");
    printf("**********<4>查看学生信息***********\n");
    printf("**********<5>退出学生信息***********\n");
    printf("************************************\n");
}
/********************
 * 函数名:look_student
 * 作用：查看学生信息
 * 参数：无
 * 返回值：无
 * 作者：hx
 *******************/
void look_student(void)
{
    /*保存头节点信息*/
    _my_type * p_tmp = p_head;
    /*制作表头*/
    printf("姓名\t\t学号\t\t性别\t\t年龄\n");
    /*遍历链表*/
    while(p_tmp->p_next != NULL)
    {
        /*打印信息*/
        printf("%s\t\t%d\t\t%s\t\t%d\n",p_tmp->p_next->data.name,p_tmp->p_next->data.ID,p_tmp->p_next->data.sex,p_tmp->p_next->data.age);
        p_tmp = p_tmp->p_next;
    }
}
/********************
 * 函数名:change_student
 * 作用：修改学生信息
 * 参数：无
 * 返回值：无
 * 作者：hx
 *******************/
void change_student(void)
{
    /*保存头节点信息*/
    _my_type * p_tmp = p_head;
    printf("请输入要修改学生的学号\n");
    int id;
    scanf("%d",&id);
    /*遍历链表*/
    while(p_tmp->p_next != NULL)
    {
        if(p_tmp->p_next->data.ID == id)
        {
            /*找到,出循环再改*/
            break;
        }
        p_tmp = p_tmp->p_next;
    }
    printf("请输入学生姓名\n");
    scanf("%s",p_tmp->p_next->data.name);
    printf("请输入学生性别\n");
    scanf("%s",p_tmp->p_next->data.sex);
    getchar();
    printf("请输入学生年龄\n");
    scanf("%d",&p_tmp->p_next->data.age);
    printf("修改成功\n");
}
/********************
 * 函数名:del_student
 * 作用：删除学生信息
 * 参数：无
 * 返回值：无
 * 作者：hx
 *******************/
void del_student(void)
{
    /*保存头节点信息*/
    _my_type * p_tmp = p_head;
    /*保存要删除节点信息*/
    _my_type * p_del = NULL;
    printf("请输入要删除学生的学号\n");
    int id;
    scanf("%d",&id);
    /*遍历链表*/
    while(p_tmp->p_next != NULL)
    {
       // i++;
        if(p_tmp->p_next->data.ID == id)
        {
            /*找到,出循环再改*/
            p_del = p_tmp->p_next;
            /*链接*/
            p_tmp->p_next = p_tmp->p_next->p_next;
            break;
        }
        p_tmp = p_tmp->p_next;
    }
    //if(i>=student_num)
    //{
      //  printf("查无此人\n");
     //   exit(0);
   // }
    /*释放空间*/
    free(p_del);
    /*学生数量-1*/
    student_num--;
    printf("删除成功\n");
}
/********************
 * 函数名:save_file
 * 作用：学生信息保存文件
 * 参数：无
 * 返回值：无
 * 作者：hx
 *******************/
void save_file(void)
{
    /*保存头节点信息*/
    _my_type * p_tmp = p_head;
    /*以读写方式打开*/
    FILE *fp = fopen("./text.txt","w");
    if(fp == NULL)
        printf("文件打开失败\n");
    else
    {
        while(p_tmp->p_next != NULL)
        {
            //写文件
            fwrite(p_tmp->p_next,sizeof(_my_type),1,fp);
            p_tmp = p_tmp->p_next;
        } 
    }
    /*关闭文件*/
    fclose(fp);
}
/********************
 * 函数名:read_file
 * 作用：从文件中读取学生信息
 * 参数：无
 * 返回值：无
 * 作者：hx
 *******************/
void read_file(void)
{
    /*保存头节点信息*/
    _my_type * p_tmp = p_head;
    /*以只读方式打开*/
    FILE *fp = fopen("./text.txt","r");
    if(fp == NULL)
        printf("文件打开失败\n");
    else
    {
        /*先读一个字符*/
        fgetc(fp);
        /*如果文件没结束*/
        while(!feof(fp))
        {
            /*文件指针偏移回首位置*/
            fseek(fp,-1,SEEK_CUR);
            /*申请空间*/
            _my_type * p_new = (_my_type*)malloc(sizeof(_my_type));
            /*初始化节点*/
            note_init(p_new);
            /*读文件*/
            fread(p_new,sizeof(_my_type),1,fp);
            /*这个地方天坑,保存的是整个节点,包括指针域,注意指针域为null*/
            p_new->p_next = NULL;
            /*找到链表尾*/
            while(p_tmp->p_next != NULL)
            {
                p_tmp = p_tmp->p_next;
            }
            /*链接*/
            p_tmp->p_next = p_new;
            /*学生数量加1*/
            student_num++;
            /*读写指针再偏移一个*/
            fgetc(fp);
        }
        /*关闭文件*/
        fclose(fp);
    }

}
/********************
 * 不要乱传
 * 仿冒必究
 *******************/
int main(void)
{
    create_head();
    read_file();
    int i = 0;
    while(1)
    {
        ui_show();
        scanf("%d",&i);
        switch(i)
        {
            case add:add_student();break;
            case del:del_student();break;
            case change:change_student();break;
            case look:look_student();break;
            case quit:save_file();return 0;
        }
    }
    return 0;
}




